package argo.hot100.review;

public class MinPathSum {


    public int minPathSum(int[][] grid) {

        int[][] dp = new int[grid.length][grid[0].length];
        dp[0][0] = grid[0][0];


        for (int i = 1; i < dp.length; i++) {
            dp[i][0] = grid[i][0] + dp[i - 1][0];
        }

        for (int i = 1; i < dp[0].length; i++) {
            dp[0][i] = grid[0][i] + dp[0][i - 1];
        }

        for (int i = 1; i < grid.length; i++) {
            for (int j = 1; j < grid[0].length; j++) {
                dp[i][j] = Math.min(dp[i - 1][j], dp[i][j - 1]) + grid[i][j];
            }
        }

        return dp[grid.length - 1][grid[0].length - 1];
    }


    int result = Integer.MAX_VALUE;

    public int minPathSumOld(int[][] grid) {

        minPathSumOld(grid, 0, 0, grid[0][0]);
        return result;

    }


    public void minPathSumOld(int[][] grid, int x, int y, int curSum) {

        if (x == grid.length - 1 && y == grid[0].length - 1 && curSum < result) {
            result = curSum;
        } else {
            if (x < grid.length - 1) {
                minPathSumOld(grid, x + 1, y, curSum + grid[x + 1][y]);
            }
            if (y < grid[0].length - 1) {
                minPathSumOld(grid, x, y + 1, curSum + grid[x][y + 1]);
            }
        }
    }


}
